﻿Public Class Usuarios

    Private oAdmin As New CAdmin
    Private idUsuario As Integer
    Private dtPerfiles As New DataTable
    Private dtPermisos As New DataTable

    Private Sub Usuarios_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.CargarUsuarios()
        Me.tabCrear.Parent = Nothing
    End Sub

    Private Sub CargarUsuarios()
        Try
            Dim ds As New DataSet
            ds = Me.oAdmin.GetUsuarios()
            If (ds.Tables(0).Rows.Count > 0) Then
                Me.grdUsuario.DataSource = Nothing
                Me.grdUsuario.Columns.Clear()
                Me.grdUsuario.DataSource = ds.Tables(0)

                Dim iconoEditar As New DataGridViewImageColumn()
                iconoEditar.ValuesAreIcons = False
                iconoEditar.Image = My.Resources.editar
                iconoEditar.HeaderText = "EDITAR"
                iconoEditar.Name = "Editar"
                Me.grdUsuario.Columns.Add(iconoEditar)

                Dim iconoEliminar As New DataGridViewImageColumn()
                iconoEliminar.ValuesAreIcons = False
                iconoEliminar.Image = My.Resources.eliminar
                iconoEliminar.HeaderText = "ELIMINAR"
                iconoEliminar.Name = "Eliminar"
                Me.grdUsuario.Columns.Add(iconoEliminar)

                Me.grdUsuario.Columns("ID").Visible = False
                Me.grdUsuario.Columns("EDITAR").Width = 50
                Me.grdUsuario.Columns("ELIMINAR").Width = 70
            Else
                Me.grdUsuario.DataSource = Nothing
                Me.grdUsuario.Columns.Clear()
                MessageBox.Show("No existen usuarios", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If
        Catch ex As Exception
            MessageBox.Show("Ocurrió un error al cargar los usuarios: " & ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try
    End Sub

    Private Sub grdUsuario_CellMouseEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles grdUsuario.CellMouseEnter
        '*** Coloca la manito cuando el mouse entra en las celdas de editar y eliminar
        If (Me.grdUsuario.Columns(e.ColumnIndex).Name = "Editar" Or Me.grdUsuario.Columns(e.ColumnIndex).Name = "Eliminar") Then
            Cursor = Cursors.Hand
        Else
            Cursor = Cursors.Default
        End If
    End Sub

    Private Sub grdUsuario_CellMouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles grdUsuario.CellMouseMove
        If (Me.grdUsuario.Columns(e.ColumnIndex).Name = "Editar" Or Me.grdUsuario.Columns(e.ColumnIndex).Name = "Eliminar") Then
            Cursor = Cursors.Hand
        Else
            Cursor = Cursors.Default
        End If
    End Sub

    Private Sub grdUsuario_CellDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles grdUsuario.CellDoubleClick
        '*** Permite editar o eliminar
        'Se obtiene la info del registro
        Dim id As Integer = Me.grdUsuario.Rows(e.RowIndex).Cells("ID").Value

        Select Case Me.grdUsuario.Columns(e.ColumnIndex).Name
            Case "Editar"
                Me.EditarUsuario(id)
            Case "Eliminar"
                Me.EliminarUsuario(id)
        End Select
    End Sub

    Private Sub EditarUsuario(ByVal id As Integer)        
        Me.Limpiar()
        Me.idUsuario = id
        Me.tabCrear.Parent = Me.TabControl1
        Me.TabControl1.SelectedTab = Me.tabCrear

        Me.TraerDatosUsuario(id)
    End Sub

    Private Sub EliminarUsuario(ByVal id As Integer)
        Try
            If (MessageBox.Show("¿Realmente desea eliminar este usuario?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes) Then
                Cursor = Cursors.WaitCursor
                Me.oAdmin.EliminarUsuario(id)
                MessageBox.Show("El usuario ha sido eliminado", "Usuario eliminado", MessageBoxButtons.OK, MessageBoxIcon.Information)

                Cursor = Cursors.Default
            End If
        Catch ex As Exception
            Cursor = Cursors.Default
            MessageBox.Show("NO se eliminó el usuario: " & ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try

        Me.CargarUsuarios()
    End Sub

    Private Sub btnNuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNuevo.Click
        Me.Limpiar()
        Me.idUsuario = 0
        Me.tabCrear.Parent = Me.TabControl1
        Me.TabControl1.SelectedTab = Me.tabCrear
        Me.TraerDatosUsuario(0)
    End Sub

    Private Sub TabControl1_Selected(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TabControlEventArgs) Handles TabControl1.Selected
        'Si se selecciona el primer tab oculta el otro
        If e.TabPageIndex = 0 Then
            Me.tabCrear.Parent = Nothing
        End If
    End Sub

    Private Sub Limpiar()
        Me.idUsuario = 0
        Me.txtUsuario.Text = ""
        Me.txtNombre.Text = ""
        Me.txtApellido.Text = ""
        Me.lstPerfiles.DataSource = Nothing
        Me.lstPermiso.DataSource = Nothing
        Me.lstPerfiles.Items.Clear()
        Me.lstPermiso.Items.Clear()
    End Sub

    Private Sub btnCancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancelar.Click
        Me.Limpiar()
        Me.TabControl1.SelectedTab = Me.tabListado
        Me.tabCrear.Parent = Nothing
    End Sub

    Private Sub TraerDatosUsuario(ByVal id As Integer)
        Try
            'Trae los datos del usuario seleccionado
            Dim ds As New DataSet
            ds = Me.oAdmin.GetUsuarioById(id)
            If (ds.Tables(0).Rows.Count > 0) Then
                Me.txtUsuario.Text = ds.Tables(0).Rows(0)("USUARIO")
                Me.txtNombre.Text = ds.Tables(0).Rows(0)("NOMBRE")
                Me.txtApellido.Text = ds.Tables(0).Rows(0)("APELLIDO")
            End If

            'Perfiles sobre los que no tiene permisos
            Me.dtPerfiles = ds.Tables(1).Copy            
            If (ds.Tables(1).Rows.Count > 0) Then
                Me.lstPerfiles.DataSource = Me.dtPerfiles
                Me.lstPerfiles.ValueMember = Me.dtPerfiles.Columns(0).ColumnName
                Me.lstPerfiles.DisplayMember = Me.dtPerfiles.Columns(1).ColumnName
            Else
                Me.lstPerfiles.DataSource = Nothing
                Me.lstPerfiles.Items.Clear()
            End If

            'Perfiles sobre los que no tiene permisos
            Me.dtPermisos = ds.Tables(2).Copy
            If (ds.Tables(2).Rows.Count > 0) Then
                Me.lstPermiso.DataSource = Me.dtPermisos
                Me.lstPermiso.ValueMember = Me.dtPermisos.Columns(0).ColumnName
                Me.lstPermiso.DisplayMember = Me.dtPermisos.Columns(1).ColumnName
            Else
                Me.lstPermiso.DataSource = Nothing
                Me.lstPermiso.Items.Clear()
            End If

        Catch ex As Exception
            MessageBox.Show("Ocurrió un error al traer la información del usuario: " & ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try
    End Sub

    Private Sub btnDerecha_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDerecha.Click

        Dim drv As DataRowView
        Dim idEliminados As New ArrayList
        For i As Integer = 0 To Me.lstPerfiles.Items.Count - 1
            'Guarda los ids de los seleccionados
            If (Me.lstPerfiles.GetSelected(i)) Then
                drv = CType(Me.lstPerfiles.Items(i), DataRowView)
                'Se insertan los valores en la otra tabla                
                Dim dr As DataRow = Me.dtPermisos.NewRow
                dr("ID") = drv(0)
                dr("PERFIL") = drv(1)
                Me.dtPermisos.Rows.Add(dr)

                'Se van guardando los registros seleccionados
                idEliminados.Add(i)
            End If
        Next

        'Se eliminan los ids que se pasaron al otro lado
        For i As Integer = Me.dtPerfiles.Rows.Count - 1 To 0 Step -1
            If (idEliminados.Contains(i)) Then
                Me.dtPerfiles.Rows.RemoveAt(i)
            End If
        Next

        'Recarga las listas
        Me.lstPerfiles.DataSource = Nothing
        Me.lstPerfiles.Items.Clear()
        Me.lstPermiso.DataSource = Nothing
        Me.lstPermiso.Items.Clear()

        If (Me.dtPerfiles.Rows.Count > 0) Then
            Me.lstPerfiles.DataSource = Me.dtPerfiles
            Me.lstPerfiles.ValueMember = Me.dtPerfiles.Columns(0).ColumnName
            Me.lstPerfiles.DisplayMember = Me.dtPerfiles.Columns(1).ColumnName
        End If
        If (Me.dtPermisos.Rows.Count > 0) Then
            Me.lstPermiso.DataSource = Me.dtPermisos
            Me.lstPermiso.ValueMember = Me.dtPermisos.Columns(0).ColumnName
            Me.lstPermiso.DisplayMember = Me.dtPermisos.Columns(1).ColumnName
        End If
    End Sub

    Private Sub btnIzquierda_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIzquierda.Click
        Dim drv As DataRowView
        Dim idEliminados As New ArrayList
        For i As Integer = 0 To Me.lstPermiso.Items.Count - 1
            'Guarda los ids de los seleccionados
            If (Me.lstPermiso.GetSelected(i)) Then
                drv = CType(Me.lstPermiso.Items(i), DataRowView)
                'Se insertan los valores en la otra tabla
                Dim dr As DataRow = Me.dtPerfiles.NewRow
                dr("ID") = drv(0)
                dr("PERFIL") = drv(1)
                Me.dtPerfiles.Rows.Add(dr)

                'Se van guardando los registros seleccionados
                idEliminados.Add(i)
            End If
        Next

        'Se eliminan los ids que se pasaron al otro lado
        For i As Integer = Me.dtPermisos.Rows.Count - 1 To 0 Step -1
            If (idEliminados.Contains(i)) Then
                Me.dtPermisos.Rows.RemoveAt(i)
            End If
        Next

        'Recarga las listas
        Me.lstPerfiles.DataSource = Nothing
        Me.lstPerfiles.Items.Clear()
        Me.lstPermiso.DataSource = Nothing
        Me.lstPermiso.Items.Clear()

        If (Me.dtPerfiles.Rows.Count > 0) Then
            Me.lstPerfiles.DataSource = Me.dtPerfiles
            Me.lstPerfiles.ValueMember = Me.dtPerfiles.Columns(0).ColumnName
            Me.lstPerfiles.DisplayMember = Me.dtPerfiles.Columns(1).ColumnName
        End If
        If (Me.dtPermisos.Rows.Count > 0) Then
            Me.lstPermiso.DataSource = Me.dtPermisos
            Me.lstPermiso.ValueMember = Me.dtPermisos.Columns(0).ColumnName
            Me.lstPermiso.DisplayMember = Me.dtPermisos.Columns(1).ColumnName
        End If
    End Sub

    Private Sub btnListo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnListo.Click
        '*** Guarda en la bd la info del usuario que se esta editando o creando
        If (Me.Validar()) Then
            Try
                Cursor = Cursors.WaitCursor
                'Guarda los perfiles en una variable
                Dim perfiles As String = ""
                For i As Integer = 0 To Me.dtPermisos.Rows.Count - 1
                    'Guarda los ids seleccionados                    
                    perfiles = perfiles & Me.dtPermisos.Rows(i)("ID").ToString & ","
                Next
                'Quita la ultima coma
                If (perfiles.Length > 0) Then
                    perfiles = perfiles.Substring(0, perfiles.Length - 1)
                End If

                Dim result As String = Me.oAdmin.ActualizarUsuario(Me.idUsuario, Trim(Me.txtUsuario.Text), Trim(Me.txtNombre.Text), Trim(Me.txtApellido.Text), perfiles)
                Cursor = Cursors.Default

                MessageBox.Show(result, "Usuario", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch ex As Exception
                Cursor = Cursors.Default
                MessageBox.Show("Ocurrió un error al guardar los datos del usuario: " & ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            End Try

            Me.Limpiar()
            Me.TabControl1.SelectedTab = Me.tabListado
            Me.tabCrear.Parent = Nothing
            Me.CargarUsuarios()
        End If
    End Sub

    Private Function Validar() As Boolean
        Dim mensaje As String = ""

        If (Trim(Me.txtUsuario.Text).Length = 0) Then
            mensaje += "- Debe escribir el usuario" & Chr(13)
        End If
        If (Trim(Me.txtNombre.Text).Length = 0) Then
            mensaje += "- Debe escribir el nombre" & Chr(13)
        End If

        'Debe tener seleccionado al menos un perfil
        If (Me.lstPermiso.Items.Count = 0) Then
            mensaje += "- El usuario debe pertenecer por lo menos a un perfil" & Chr(13)
        End If

        If (mensaje.Length > 0) Then
            MessageBox.Show(mensaje, "Datos incompletos", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Return False
        Else
            Return True
        End If
    End Function

End Class